package org.example.campusforum.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.example.campusforum.dto.ArticleGet;
import org.example.campusforum.dto.ArticleGetResponse;
import org.example.campusforum.dto.ArticleGetResponseDataRecord;
import org.example.campusforum.entity.Article;
import org.example.campusforum.entity.User;
import org.example.campusforum.mapper.ArticleGetMapper;
import org.example.campusforum.mapper.UserMapper;
import org.example.campusforum.service.ArticleGetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 文章查询服务实现类
 *
 * 实现多种条件的文章查询功能，支持按用户ID、标题、分类ID等条件查询文章，
 * 提供多种排序方式和分页功能。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@Service
public class ArticleGetServiceImpl implements ArticleGetService {

    /**
     * 文章查询数据访问层
     */
    @Autowired
    private ArticleGetMapper articleGetMapper;

    /**
     * 用户数据访问层
     */
    @Autowired
    private UserMapper userMapper;


    /**
     * 根据用户ID查询文章
     *
     * 查询指定用户发布的所有文章，支持按点赞数、浏览数、评论数排序，
     * 并提供分页功能。
     *
     * @param articleGet 文章查询条件，包含用户ID、排序类型、分页信息
     * @return 文章查询响应，包含文章列表和总数
     */
    @Override
    public ArticleGetResponse getArticleByUserId(ArticleGet articleGet) {
        // 获取查询的用户ID
        int userId = articleGet.getId();

        // 构建查询条件：未删除且属于指定用户的文章
        QueryWrapper<Article> wrapper = new QueryWrapper<Article>()
                .eq("is_deleted", 0)
                .eq("user_id", userId);

        // 根据排序类型添加排序条件
        Long sortType = articleGet.getSortType();
        if (sortType != null) {
            if (sortType == 2) {
                // 按点赞数降序排列
                wrapper.orderByDesc("like_count");
            } else if (sortType == 3) {
                // 按浏览数降序排列
                wrapper.orderByDesc("view_count");
            } else if (sortType == 4) {
                // 按评论数降序排列
                wrapper.orderByDesc("comment_count");
            }
        }

        // 查询文章列表
        List<Article> articles = articleGetMapper.selectList(wrapper);

        // 查询用户信息（昵称和头像）
        QueryWrapper<User> userWrapper = new QueryWrapper<User>()
                .select("nickname", "avatar")
                .eq("id", userId);
        User user = userMapper.selectOne(userWrapper);

        // 分页处理
        ArrayList<ArticleGetResponseDataRecord> list = new ArrayList<>();
        int page = articleGet.getPage();
        int pageSize = articleGet.getPageSize();
        int start = (page - 1) * pageSize;
        int end = start + pageSize;
        if (end > articles.size()) {
            end = articles.size();
        }

        // 构建返回数据记录
        for (int i = start; i < end; i++) {
            Article article = articles.get(i);
            ArticleGetResponseDataRecord record = new ArticleGetResponseDataRecord();
            record.setArticleId(article.getId());
            record.setAvatar(user.getAvatar());
            record.setContent(article.getContent());
            record.setTitle(article.getTitle());
            record.setNickname(user.getNickname());
            record.setViewCount(article.getViewCount());
            record.setLikeCount(article.getLikeCount());
            record.setCommentCount(article.getCommentCount());
            list.add(record);
        }

        // 构建响应对象
        ArticleGetResponse response = new ArticleGetResponse();
        response.setTotal(articles.size());
        response.setRecords(list);

        return response;
    }

    /**
     * 根据标题查询文章
     *
     * 使用模糊查询方式根据文章标题搜索文章，支持多种排序方式和分页。
     *
     * @param articleGet 文章查询条件，包含标题关键词、排序类型、分页信息
     * @return 文章查询响应，包含匹配的文章列表和总数
     */
    @Override
    public ArticleGetResponse getArticleByTitle(ArticleGet articleGet) {
        // 获取搜索标题关键词
        String title = articleGet.getTitle();

        // 获取排序类型
        long sortType = articleGet.getSortType();

        // 执行标题模糊查询，包含作者信息
        ArrayList<ArticleGetResponseDataRecord> articleGetResponseDataRecords =
                articleGetMapper.selectArticles(title, sortType);

        // 分页处理
        int page = articleGet.getPage();
        int pageSize = articleGet.getPageSize();
        int start = (page - 1) * pageSize;
        int end = start + pageSize;
        if (end > articleGetResponseDataRecords.size()) {
            end = articleGetResponseDataRecords.size();
        }

        // 获取当前页数据
        ArrayList<ArticleGetResponseDataRecord> list = new ArrayList<>(
                articleGetResponseDataRecords.subList(start, end)
        );

        // 构建响应对象
        ArticleGetResponse response = new ArticleGetResponse();
        response.setTotal(articleGetResponseDataRecords.size());
        response.setRecords(list);
        return response;
    }

    /**
     * 根据分类ID查询文章
     *
     * 查询指定分类下的所有文章，支持多种排序方式和分页功能。
     *
     * @param articleGet 文章查询条件，包含分类ID、排序类型、分页信息
     * @return 文章查询响应，包含该分类下的文章列表和总数
     */
    @Override
    public ArticleGetResponse getArticleByCategoryId(ArticleGet articleGet) {
        // 获取分类ID
        Long categoryId = articleGet.getCategoryId();

        // 获取排序类型
        long sortType = articleGet.getSortType();

        // 执行分类查询，包含作者信息
        ArrayList<ArticleGetResponseDataRecord> articleGetResponseDataRecords =
                articleGetMapper.selectArticlesByCategoryId(categoryId, sortType);

        // 分页处理
        int page = articleGet.getPage();
        int pageSize = articleGet.getPageSize();
        int start = (page - 1) * pageSize;
        int end = start + pageSize;
        if (end > articleGetResponseDataRecords.size()) {
            end = articleGetResponseDataRecords.size();
        }

        // 获取当前页数据
        ArrayList<ArticleGetResponseDataRecord> list = new ArrayList<>(
                articleGetResponseDataRecords.subList(start, end)
        );

        // 构建响应对象
        ArticleGetResponse response = new ArticleGetResponse();
        response.setTotal(articleGetResponseDataRecords.size());
        response.setRecords(list);
        return response;
    }

    /**
     * 根据标题和分类ID查询文章
     *
     * 在指定分类下使用标题关键词搜索文章，支持多种排序方式和分页功能。
     *
     * @param articleGet 文章查询条件，包含标题关键词、分类ID、排序类型、分页信息
     * @return 文章查询响应，包含匹配条件的文章列表和总数
     */
    @Override
    public ArticleGetResponse getArticleByTitleAndCategoryId(ArticleGet articleGet) {
        // 获取分类ID和标题关键词
        Long categoryId = articleGet.getCategoryId();
        String title = articleGet.getTitle();

        // 获取排序类型
        long sortType = articleGet.getSortType();

        // 执行组合条件查询，包含作者信息
        ArrayList<ArticleGetResponseDataRecord> articleGetResponseDataRecords =
                articleGetMapper.selectArticlesByTitleAndCategoryId(title, categoryId, sortType);

        // 分页处理
        int page = articleGet.getPage();
        int pageSize = articleGet.getPageSize();
        int start = (page - 1) * pageSize;
        int end = start + pageSize;
        if (end > articleGetResponseDataRecords.size()) {
            end = articleGetResponseDataRecords.size();
        }

        // 获取当前页数据
        ArrayList<ArticleGetResponseDataRecord> list = new ArrayList<>(
                articleGetResponseDataRecords.subList(start, end)
        );

        // 构建响应对象
        ArticleGetResponse response = new ArticleGetResponse();
        response.setTotal(articleGetResponseDataRecords.size());
        response.setRecords(list);
        return response;
    }

}















